package com.yc;

import org.apache.log4j.Logger;

import java.io.IOException;
import java.io.OutputStream;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @program: concurrent
 * @description: ServerSocket
 * @author: zy
 * @create: 2022-01-13 11:22
 */
public class Test3_Server {
    private static Logger log= Logger.getLogger(    Test3_Server.class.getName() );

    public static void main(String[] args) throws IOException {
        //方案一: 直接指定一个端口
        //方案二: 循环10000以上的端口，试一个空闲的端口  ***
        //　　方案三： 将端口配置在一个 　　　.xml|.properties　　　的文件．
        final int port = 10000;
        ServerSocket ss=null;
        for(  int i=10000;i<=65535;i++) {
            try {
                //完成一台时间服务 选择合适端口的工作
                ss = new ServerSocket(   i     );
                break;   //打断 循环.
            } catch (Exception ex) {
                //ex.printStackTrace();
                if(   ex instanceof BindException){
                    //用错误日志 记录 端口被占用的信息
                   log.error(     "端口:"+  i  +"已经被占用"  );
                }
            }
        }
        //  用info级别记录  ServerSocket套接字创建成功的信息.
        log.info(  ss.getInetAddress().getHostName() + "启动了,监听了端口号: ****" + ss.getLocalPort() + "***...");

        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date d = null;
        String time = null;

        while (true) {
            log.info("服务端ServerSocket准备等待客户端的联接");
            //只要有一个客户端联接到服务器，获取一个与客户端的套接字 Socket对象
            Socket s = ss.accept();   //阻塞式的方法
           log.info("(理解阻塞的意思...)获取了一个与客户端:" + s.getRemoteSocketAddress() + "的联接");

           //TODO:   服务器中的业务
           d = new Date();
           time = df.format(d);

            //套接字编程的底层就是io, 这是什么流.   输入  |  输出
            try(   OutputStream oos=     s.getOutputStream();) {
                oos.write(time.getBytes());
                oos.flush();
            }catch( Exception ex){
                ex.printStackTrace();
            }
            s.close();
            log.info("服务端断开与客户端的联接");
        }
    }

}
